package com.hbpu.usercenter.common;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.io.Serial;
import java.io.Serializable;

/**
 * 通用返回类
 * <p>
 * 用于封装接口统一返回结果，包含状态码、返回数据、提示信息和描述信息。
 * 通过泛型 <T> 来支持不同类型的数据返回。
 *
 * @param <T> 返回的数据类型
 */
@Schema(description = "通用返回类 <p> 用于封装接口统一返回结果，包含状态码、返回数据、提示信息和描述信息。 通过泛型 <T> 来支持不同类型的数据返回。")
@Data // Lombok 注解，自动生成 getter/setter、toString、equals、hashCode 等方法
public class BaseResponse<T> implements Serializable {

    /**
     * 序列化 ID
     * <p>
     * 用于保证在反序列化时，类的版本兼容性。
     */
    @Serial
    private static final long serialVersionUID = -7834331599169637056L;

    /**
     * 状态码
     * <p>
     * 一般用于表示接口调用结果
     */
    @Schema(description = "状态码 <p> 一般用于表示接口调用结果")
    private int code;

    /**
     * 返回的数据
     * <p>
     * 类型由泛型 <T> 决定，可以是对象、集合或基本类型。
     */
    @Schema(description = "返回的数据 <p> 类型由泛型 <T> 决定，可以是对象、集合或基本类型。")
    private T data;

    /**
     * 消息
     * <p>
     * 对本次接口调用的简要提示，例如："操作成功"、"参数错误"。
     */
    @Schema(description = "消息 <p> 对本次接口调用的简要提示，例如：\"操作成功\"、\"参数错误\"。")
    private String message;

    /**
     * 描述
     * <p>
     * 对消息进行更详细的补充说明，方便开发和调试。
     */
    @Schema(description = "描述 <p> 对消息进行更详细的补充说明，方便开发和调试。")
    private String description;

    /**
     * 全参构造函数
     *
     * @param code        状态码
     * @param data        返回的数据
     * @param message     提示消息
     * @param description 详细描述
     */
    public BaseResponse(int code, T data, String message, String description) {
        this.code = code;
        this.data = data;
        this.message = message;
        this.description = description;
    }

    /**
     * 三参构造函数
     * <p>
     * 适用于不需要描述信息时。
     *
     * @param code    状态码
     * @param data    返回的数据
     * @param message 提示消息
     */
    public BaseResponse(int code, T data, String message) {
        this(code, data, message, "");
    }

    /**
     * 双参构造函数
     * <p>
     * 适用于只需要状态码和数据时。
     *
     * @param code 状态码
     * @param data 返回的数据
     */
    public BaseResponse(int code, T data) {
        this(code, data, "", "");
    }

    /**
     * 使用枚举构造返回对象
     * <p>
     * 通过 {@link ErrorCode} 枚举类快速构建通用的错误响应。
     *
     * @param errorCode 错误码枚举，包含状态码、提示消息和描述
     */
    public BaseResponse(ErrorCode errorCode) {
        this(errorCode.getCode(), null, errorCode.getMessage(), errorCode.getDescription());
    }
}
